/*
@title: Knight Buster
@description: "Knight Buster" is a multiplayer game where one player controls a playful Halloween ghost trying to catch a friendly knight, who is attempting to escape. The knight can push boxes to hinder the ghost, and wins if the ghost bumps into boxes three times, while the ghost wins by catching the knight three times.
@author: Isobel P
@tags: ['multiplayer']
@addedOn: 2024-07-22
*/

const intro = tune`
333.3333333333333: C4~333.3333333333333 + E4~333.3333333333333 + G4~333.3333333333333 + C5~333.3333333333333 + E5~333.3333333333333,
333.3333333333333: C4~333.3333333333333 + E4~333.3333333333333 + G4~333.3333333333333 + C5~333.3333333333333 + E5~333.3333333333333,
333.3333333333333: C4~333.3333333333333 + E4~333.3333333333333 + G4~333.3333333333333 + C5~333.3333333333333 + E5~333.3333333333333,
333.3333333333333: C4~333.3333333333333 + G4~333.3333333333333 + C5~333.3333333333333 + E4~333.3333333333333 + E5~333.3333333333333,
333.3333333333333: C4~333.3333333333333 + E4~333.3333333333333 + G4~333.3333333333333 + C5~333.3333333333333 + E5~333.3333333333333,
333.3333333333333: C4~333.3333333333333 + E4~333.3333333333333 + G4~333.3333333333333 + C5~333.3333333333333 + E5~333.3333333333333,
333.3333333333333: C4~333.3333333333333 + E4~333.3333333333333 + G4~333.3333333333333 + C5~333.3333333333333 + E5~333.3333333333333,
333.3333333333333: C4~333.3333333333333 + E4~333.3333333333333 + G4~333.3333333333333 + C5~333.3333333333333 + E5~333.3333333333333,
333.3333333333333: D4~333.3333333333333 + F4~333.3333333333333 + A4~333.3333333333333 + D5~333.3333333333333 + F5~333.3333333333333,
333.3333333333333: D4~333.3333333333333 + F4~333.3333333333333 + A4~333.3333333333333 + D5~333.3333333333333 + F5~333.3333333333333,
333.3333333333333: D4~333.3333333333333 + F4~333.3333333333333 + A4~333.3333333333333 + D5~333.3333333333333 + F5~333.3333333333333,
333.3333333333333: D4~333.3333333333333 + F4~333.3333333333333 + A4~333.3333333333333 + D5~333.3333333333333 + F5~333.3333333333333,
333.3333333333333: D4~333.3333333333333 + F4~333.3333333333333 + A4~333.3333333333333 + D5~333.3333333333333 + F5~333.3333333333333,
333.3333333333333: D4~333.3333333333333 + F4~333.3333333333333 + A4~333.3333333333333 + D5~333.3333333333333 + F5~333.3333333333333,
333.3333333333333: D4~333.3333333333333 + F4~333.3333333333333 + A4~333.3333333333333 + D5~333.3333333333333 + F5~333.3333333333333,
333.3333333333333: D4~333.3333333333333 + F4~333.3333333333333 + A4~333.3333333333333 + D5~333.3333333333333 + F5~333.3333333333333,
333.3333333333333: C4~333.3333333333333 + E4~333.3333333333333 + G4~333.3333333333333 + C5~333.3333333333333 + E5~333.3333333333333,
333.3333333333333: C4~333.3333333333333 + E4~333.3333333333333 + G4~333.3333333333333 + C5~333.3333333333333 + E5~333.3333333333333,
333.3333333333333: C4~333.3333333333333 + E4~333.3333333333333 + G4~333.3333333333333 + C5~333.3333333333333 + E5~333.3333333333333,
333.3333333333333: C4~333.3333333333333 + E4~333.3333333333333 + G4~333.3333333333333 + C5~333.3333333333333 + E5~333.3333333333333,
333.3333333333333: E4~333.3333333333333 + G4~333.3333333333333 + B4~333.3333333333333 + E5~333.3333333333333 + G5~333.3333333333333,
333.3333333333333: E4~333.3333333333333 + G4~333.3333333333333 + B4~333.3333333333333 + E5~333.3333333333333 + G5~333.3333333333333,
333.3333333333333: E4~333.3333333333333 + G4~333.3333333333333 + B4~333.3333333333333 + E5~333.3333333333333 + G5~333.3333333333333,
333.3333333333333: E4~333.3333333333333 + G4~333.3333333333333 + B4~333.3333333333333 + E5~333.3333333333333 + G5~333.3333333333333,
333.3333333333333: D4~333.3333333333333 + F4~333.3333333333333 + A4~333.3333333333333 + D5~333.3333333333333 + F5~333.3333333333333,
333.3333333333333: D4~333.3333333333333 + F4~333.3333333333333 + A4~333.3333333333333 + D5~333.3333333333333 + F5~333.3333333333333,
333.3333333333333: D4~333.3333333333333 + F4~333.3333333333333 + A4~333.3333333333333 + D5~333.3333333333333 + F5~333.3333333333333,
333.3333333333333: D4~333.3333333333333 + F4~333.3333333333333 + A4~333.3333333333333 + D5~333.3333333333333 + F5~333.3333333333333,
333.3333333333333: C4~333.3333333333333 + E4~333.3333333333333 + G4~333.3333333333333 + C5~333.3333333333333 + E5~333.3333333333333,
333.3333333333333: C4~333.3333333333333 + E4~333.3333333333333 + G4~333.3333333333333 + C5~333.3333333333333 + E5~333.3333333333333,
333.3333333333333: C4~333.3333333333333 + E4~333.3333333333333 + G4~333.3333333333333 + C5~333.3333333333333 + E5~333.3333333333333,
333.3333333333333: C4~333.3333333333333 + E4~333.3333333333333 + G4~333.3333333333333 + C5~333.3333333333333 + E5~333.3333333333333`
const bgm = tune`
333.3333333333333: C4-333.3333333333333 + E4-333.3333333333333 + G4-333.3333333333333 + C5-333.3333333333333 + E5-333.3333333333333,
333.3333333333333: C5-333.3333333333333,
333.3333333333333: B4-333.3333333333333,
333.3333333333333: A4-333.3333333333333,
333.3333333333333: E5-333.3333333333333 + C5-333.3333333333333 + G4-333.3333333333333 + E4-333.3333333333333 + C4-333.3333333333333,
333.3333333333333: C5-333.3333333333333,
333.3333333333333: B4-333.3333333333333,
333.3333333333333,
333.3333333333333: F5-333.3333333333333 + D5-333.3333333333333 + A4-333.3333333333333 + F4-333.3333333333333 + D4-333.3333333333333,
333.3333333333333: D5-333.3333333333333,
333.3333333333333: C5-333.3333333333333,
333.3333333333333: B4-333.3333333333333,
333.3333333333333: F5-333.3333333333333 + D5-333.3333333333333 + A4-333.3333333333333 + F4-333.3333333333333 + D4-333.3333333333333,
333.3333333333333: D5-333.3333333333333,
333.3333333333333: C5-333.3333333333333,
333.3333333333333,
333.3333333333333: E5-333.3333333333333 + C5-333.3333333333333 + G4-333.3333333333333 + E4-333.3333333333333 + C4-333.3333333333333,
333.3333333333333: C5-333.3333333333333,
333.3333333333333: B4-333.3333333333333,
333.3333333333333: A4-333.3333333333333,
333.3333333333333: G5-333.3333333333333 + E5-333.3333333333333 + B4-333.3333333333333 + G4-333.3333333333333 + E4-333.3333333333333,
333.3333333333333: E5-333.3333333333333,
333.3333333333333: D5-333.3333333333333,
333.3333333333333: C5-333.3333333333333,
333.3333333333333: F5-333.3333333333333 + D5-333.3333333333333 + A4-333.3333333333333 + F4-333.3333333333333 + D4-333.3333333333333,
333.3333333333333: D5-333.3333333333333,
333.3333333333333: C5-333.3333333333333,
333.3333333333333: B4-333.3333333333333,
333.3333333333333: C4-333.3333333333333 + E4-333.3333333333333 + G4-333.3333333333333 + C5-333.3333333333333 + E5-333.3333333333333,
333.3333333333333: C5-333.3333333333333,
333.3333333333333: C5-333.3333333333333,
333.3333333333333: G4-333.3333333333333`
const move = tune`
500: B4~500,
15500`
const p1_sound = tune`
3000: C4^3000 + G4^3000 + C5^3000 + D4^3000,
93000`
const p2_sound = tune`
3000: C4~3000 + G4~3000 + C5~3000 + D4~3000,
93000`
introMusic = playTune(intro, Infinity)

const p1 = "h"
const p2 = "g"
const floor = "f"
const box = "w"

p1_lives = 3
p2_lives = 3
winner = 0
whoMoved = 0

setLegend(
  /*[ floor, bitmap`
22LLLLLLLLLL11L2
111LL22221LLLL22
111L2211111LL221
111L21111111L111
11LL11111111LL11
LLLLLL11111LLLLL
LL221LLLLLL222LL
222111LLL22111LL
221111LL221111L2
11111LL2211111L1
111LLLL111111LLL
LLLL22LL1111LLLL
1LL2211LLLLLL211
1L2211111LL22111
LL2111111L211111
LLL11111LL11111L`],*/
  [floor, bitmap`
1111111111111111
1111111111111111
1111111111111111
1111111111111111
1111111111111111
1111111111111111
1111111111111111
1111111111111111
1111111111111111
1111111111111111
1111111111111111
1111111111111111
1111111111111111
1111111111111111
1111111111111111
1111111111111111`],
  [p1, bitmap`
.000.000000.....
055001L1L1L0....
050011L1L1L0....
000001111110.0..
0.0110000000010.
..011222220.010.
..011252250.010.
..011252250.010.
...01222220.010.
.00000111000010.
0111011111005550
.05001110105020.
0000000010L0550.
05500111110.00..
05500550050.....
.00.0LL00LL0....`],
  [p2, bitmap`
.......000......
......00........
.....000........
....3333........
..00000000......
...022220.......
..02222220......
.0222222220.....
.0220220220.....
.0332222330.....
.0220220220.....
.0222002220.0...
..022222220020..
...02222222220..
....022222200...
.....000000.....`],
  [box, bitmap`
.00000000000000.
0CCCCCCCCCCCCCC0
0CCCCCL1LCCCCCC0
000000L1L0000000
0CCCCCLLLCCCCCC0
0CCCCCCCCCCCCCC0
0CCCCCCCCCCCCCC0
0CCCCCCCCCCCCCC0
0CCCCCCCCCCCCCC0
0CCCCCCCCCCCCCC0
0CCCCCCCCCCCCCC0
0CCCCCCCCCCCCCC0
0CCCCCCCCCCCCCC0
0CCCCCCCCCCCCCC0
0CCCCCCCCCCCCCC0
0000000000000000`],
)

setSolids([p1, box])

let level = 0
const levels = [
  map`
..........
.........h
..........
..........
.........g
..........
..........
..........`,
  map`
h.........
..........
..........
..........
..........
..........
..........
.........g`
]

setBackground(floor)

setMap(levels[level])

setPushables({
  [p1]: [box]
})

addText("-KNIGHT AND GHOST-", {x: 1, y: 1, color: color`2`});
addText("Knight (P1): \nEscape the Ghost!\nWin if Ghost goes\ninto walls 3 times!\n Move with WASD", {x: 1, y: 3, color: color`5`});
addText("Ghost (P2): \nCatch the Knight!\nWin by catching the\nKnight three times!\n Move with IJKL", {x: 1, y:9, color: color`3`});
addText("Press any key to\n     start!", {x: 2, y: 14, color: color`2`});

onInput("w", () => {
  getFirst(p1).y -= 1
  whoMoved = 1
})
onInput("a", () => {
  getFirst(p1).x -= 1
  whoMoved = 1
})
onInput("s", () => {
  getFirst(p1).y += 1
  whoMoved = 1
})
onInput("d", () => {
  getFirst(p1).x += 1
  whoMoved = 1
})
onInput("i", () => {
  getFirst(p2).y -= 1
  whoMoved = 2
})
onInput("j", () => {
  getFirst(p2).x -= 1
  whoMoved = 2
})
onInput("k", () => {
  getFirst(p2).y += 1
  whoMoved = 2
})
onInput("l", () => {
  getFirst(p2).x += 1
  whoMoved = 2
})

afterInput(() => {
  if (level === 1) {
    playTune(move)
    if (whoMoved === 2) {
      if (tilesWith(p2, box).length === 1) {
        p2_lives -= 1
        playTune(p2_sound)
      }
    }
    if (tilesWith(p1, p2).length === 1) {
      p1_lives -= 1
      playTune(p1_sound)
    }
    if (winner === 0) {
      if (p1_lives === 0) {
        winner = 2
      } else if (p2_lives === 0) {
        winner = 1
      }
    } else if (winner === 1) {
      addText("Knight Wins!", { y: 4, color: color`5` });
    } else if (winner === 2) {
      addText("Ghost Wins!", { y: 4, color: color`3` });
    }
  } else {
    const allSprites = getAll()
    allSprites.forEach(sprite => {
      sprite.remove()
    })
    introMusic.end()
    clearText()
    level += 1
    playTune(intro, Infinity)
    playTune(bgm, Infinity)
    for (let i = 1; i < 16; i++) {
      addSprite(Math.floor(Math.random() * 10), Math.floor(Math.random() * 8), box)
    }
    player1 = addSprite(0,0,p1)
    player2 = addSprite(9, 7, p2)
  }
});